package learm.pers.studygitlab.code.service;

import learm.pers.studygitlab.code.vo.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @ClassName: CodeService
 * @Description:
 * @Author: fangqing
 * @Date: 2021/6/28
 */
public interface CodeService {
    /** *********************** start 用户 ***************************** **/
    /**
     * 创建用户（只有管理员才能进行创建）
     * @param gitUserVo
     * @return
     */
    String createUser(GitUserVo gitUserVo);
    /**
     * 根据用户id获取用户
     * @param userId
     * @return
     */
    GitUserVo findUser(Long userId,String flag);
    /**
     * 编辑用户（只有管理员才能进行创建）
     * @param gitUserVo
     * @return
     */
    String editUser(GitUserVo gitUserVo);
    /**
     * 删除用户（只有管理员才能进行）
     * @param userId
     * @param project_uuid
     * @return
     */
    String deleteUser(Long userId, String project_uuid);

    /**
     * 创建用户个人令牌
     * @param gitPrivateTokenVo
     * @return
     */
    String createUserPrivateToken(GitPrivateTokenVo gitPrivateTokenVo);



    /** *********************** end 用户 ***************************** **/

    /**
     * 直接获取远程的GITLIB的所有项目
     * @return
     */
    List<GitProjectVo> getLongRangeProjects(int page, int per_page, String projectUuid, String codeName);

    /**
     * 根据代码库Id查询该代码库的详细信息
     * @param codeId 代码库Id
     * @return
     */
    GitProjectVo getProjectsByCodeId(Long codeId);

    /**
     * 添加代码库
     * @param gitProjectAddVo
     * @return
     */
    String addCodeLib(GitProjectAddVo gitProjectAddVo);

    /**
     * 导入代码库
     * @param loginUser
     * @param file
     * @param name
     * @param path
     * @param namespace
     * @param projectId
     * @return
     */
    Boolean importCodeBase(MultipartFile file, String name, String path, Long namespace, String projectId);

    /**
     * 通过url导入代码库
     * @param gitProjectRepoByUrlVo
     * @return
     */
    String importRepoByUrlCodeBase(GitProjectRepoByUrlVo gitProjectRepoByUrlVo);

    /**
     * 编辑代码库
     * @param gitProjectAddVo
     * @return
     */
    String editCodeBase(GitProjectAddVo gitProjectAddVo);
    /**
     * 删除代码库
     * @param codeId 代码库id
     * @param projectId 项目id
     * @return
     */
    void deleteCodeLib(Long codeId,String projectId);

    /**
     * 根据id或者名称搜索群组
     * @param id 空间id
     * @return
     */
    Object findGroups(Long id, int page,int per_page,String isPage);
    /**
     * 添加群组
     * @param gitGroupsVo
     * @return
     */
    String addGroups(GitGroupsVo gitGroupsVo);
    /**
     * 导入群组
     * @param file 文件
     * @param name 要导入的群组的名称。如果未提供，则默认为项目路径
     * @param path 新群组的名称和路径
     * @return
     */
    Boolean importGroups(MultipartFile file, String name, String path);

    /**
     * 编辑群组
     * @param gitGroupsVo
     * @return
     */
    String editGroups(GitGroupsVo gitGroupsVo);

    /**
     * 删除群组 gitLab默认延迟删除 7天，现已经改为立即删除
     * @param groupsId
     * @return
     */
    String deleteGroups(Long groupsId);
    /**
     * 根据群组获取群组的代码库
     * @param page
     * @param per_page
     * @param groupsId
     * @return
     */
    List<GitProjectVo> findCodeByGroupsId(int page, int per_page, Long groupsId,String flag);

    /**
     * 根据代码库id和 状态 获取合并请求
     * @param codeId 代码库id
     * @param state  ( opened、closed、 或merged) 或所有状态 ( ) 的合并请求all
     * @return
     */
    List<GitMergeVo> getMerge(Long codeId, String state);
    /**
     * 根据代码库id，获取分支，也可获取该代码库的单个分支
     * @param codeId
     * @param branchName
     * @return
     */
    Object getBranches(Long codeId,String branchName);
    /**
     * 添加分支
     * @param gitBranchAddVo
     * @return
     */
    GitBranchVo addBranches(GitBranchAddVo gitBranchAddVo);

    /**
     * 根据项目及分支获取提交记录 每次能查询20条记录
     * @param codeId 代码库id
     * @param branchName 分支名称
     * @param page 页 从1开始
     * @return
     */
    List<GitBranchCommitVo> getBranchesCommits(Long codeId, String branchName, int page,int per_page) throws Exception;


}
